package com.tutu.starter.config;


import com.tutu.starter.bean.Car;
import com.tutu.starter.bean.Pet;
import com.tutu.starter.bean.User;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * @Program: springboot_project
 * @Description: 配置类
 * @Author: JK.TuTu
 * @Create: 2022-10-15 17:33
 **/

/**
 * @Configuration 告诉springboot这是一个配置类 类似于Spring的配置文件
 * @Import 给容器创建User类型的组件   默认组件名就是类的全类名
 */
@Import({User.class})
@Configuration(proxyBeanMethods = false)
//@EnableConfigurationProperties 开启Car配置绑定功能   把Car自动注册到容器中
@EnableConfigurationProperties(Car.class)
public class SpringConfig {


    /**
     * @Bean注解：向容器中添加组件 类似与Spring配置文件中的<bean></bean>标签 若不指定name属性 则以方法名作为组件的id 默认是单实例的
     * Full 全模式，proxyBeanMethods默认是true：使用代理，也就是说该配置类会被代理，直接从IOC容器之中取得bean对象，不会创建新的对象。SpringBoot总会检查这个组件是否在容器中是否存在，保持组件的单实例。
     * Lite 轻量级模式，proxyBeanMethods设置为false：每次调用@Bean标注的方法获取到的对象是一个新的bean对象,和之前从IOC容器中获取的不一样，SpringBoot会跳过检查这个组件是否在容器中是否存在，保持组件的多实例。
     * 当在你的同一个Configuration配置类中，注入到容器中的bean实例之间有依赖关系时，建议使用Full全模式
     * 当在你的同一个Configuration配置类中，注入到容器中的bean实例之间没有依赖关系时，建议使用Lite轻量级模式，以提高springboot的启动速度和性能
     */

    //@ConditionalOnBean 当IOC容器中存在名为‘student’对象时 才会注入user这个对象
    @Bean(name = "user")
    //@ConditionalOnBean(name="student")
    public User user() {
        return new User("李四", 16);
    }


    @Bean(name = "pet")
    public Pet pet() {
        return new Pet("小黑", 1);
    }

}
